AgonesでEKS上にゲームサーバを構築してみた
こんにちは、ゲームソリューション部のsoraです。
今回は、AgonesでEKS上にゲームサーバを構築してみたことについて書いていきます。
Agonesとは
Agonesは、Kubernetes上でゲームサーバのホスティングとスケーリングを行うOSSです。
Agonesを使用することで、KubernetesのPodとしてゲームサーバを構築することができ、要求に応じてゲームサーバのオートスケールを行うことができます。
ゲームサーバのスケーリングについて、最大数・最小数・バッファ数を設定することができます。
Agonesを導入するメリットは以下です。
- ゲームサーバの割り当てやオートスケールを行うことができる。
- 実行中のゲームサーバを終了しないように保護できる。
⇒Kubernetesのみではゲームが実行中かどうかまでは判断することができず、Podとして起動しているゲームサーバを削除してしまう場合がある。
Agonesを使用することで、ゲームサーバが実行中かどうかを判断して、実行中であれば削除しないように保護できる。 - Kubernetes上に構築できる。
⇒オーケストレーションツールとしてKubernetesを実行している環境であれば、EKSに限らず別クラウドのKubernetesサービスやオンプレミスなどの環境でも容易に実現可能
クライアント実行環境
それでは実際に構築とテストをしていきます。
クライアントとしてCloud9(インスタンスタイプ:t2.micro)を使用します。
Agonesをインストールして使用する中でeksctl・kubectl・helmが必要なため、インストールしておきます。
今回の環境におけるそれぞれのバージョンは以下です。
$ eksctl version 0.154.0 $ kubectl version --short Client Version: v1.27.1-eks-2f008fe Kustomize Version: v5.0.1 $ helm version version.BuildInfo{Version:"v3.12.3", GitCommit:"3a31588ad33fe3b89af5a2a54ee1d25bfe6eaa5e", GitTreeState:"clean", GoVersion:"go1.20.7"}
インストール
以下公式ページにて導入手順が説明されています。
YAMLの他にHelmでもインストールが可能です。
Install Agones using YAML
手順通りに進めていくだけのため、導入手順の説明は割愛します。
Agonesを導入すると、公式の導入手順にて最初に作成したnamespaceのagones-systemにいくつかのpodが作成されていることがわかります。
$ kubectl get pod -n agones-system NAME READY STATUS RESTARTS AGE agones-allocator-5cbcb877bc-6kz9h 0/1 ContainerCreating 0 8s agones-allocator-5cbcb877bc-ptj25 0/1 ContainerCreating 0 8s agones-allocator-5cbcb877bc-trjtx 0/1 ContainerCreating 0 8s agones-controller-645c8dcb9-d4x7n 0/1 ContainerCreating 0 8s agones-controller-645c8dcb9-z7z54 0/1 ContainerCreating 0 8s agones-extensions-656fdc49fd-5cslc 0/1 ContainerCreating 0 8s agones-extensions-656fdc49fd-qq2tm 0/1 ContainerCreating 0 8s agones-ping-7cdff44645-9nmkq 0/1 ContainerCreating 0 8s agones-ping-7cdff44645-dc8pk 0/1 ContainerCreating 0 8s
それぞれの役割は以下です。
- agones-allocator:ゲームサーバをノードに割り振る役割を持ち、APIのエンドポイントも提供
- agones-controller:ゲームサーバのステータスを変更する役割
- agones-extensions:拡張機能を管理する役割
- agones-ping:クライアントからゲームサーバまでのレイテンシ測定の役割を持ち、マルチリージョン構成であればレイテンシをもとにクライアントから距離が近いゲームサーバを提供することも可能
テスト
導入が完了したので、テストしていきます。
Agonesのフリートオートスケーラーによってゲームサーバがスケールする動きを見ていきます。
オートスケーラーの設定は、バッファ数を2、最大数を10、最小数を0としています。
マニュアル記載の通り、Kubectl createでゲームサーバのallocateを行います。(SDKなどを使用してゲームサーバのステータス変更を行うことも可能です。)
実行すると、ステータスがReadyだったゲームサーバが1台Allocatedに変化しており、バッファ数を維持するために追加で1台のゲームサーバがReadyの状態で追加されていることがわかります。
# allocate前 $ kubectl get gs NAME STATE ADDRESS PORT NODE AGE simple-game-server-4mp76-fjr6t Ready ec2-54-250-197-188.ap-northeast-1.compute.amazonaws.com 7369 ip-192-168-8-240.ap-northeast-1.compute.internal 2m11s simple-game-server-4mp76-k75cs Ready ec2-54-250-197-188.ap-northeast-1.compute.amazonaws.com 7474 ip-192-168-8-240.ap-northeast-1.compute.internal 2m11s # ReadyのPodを割り当てる $ kubectl create -f https://raw.githubusercontent.com/googleforgames/agones/release-1.34.0/examples/simple-game-server/gameserverallocation.yaml -o yaml # allocate後 $ kubectl get gs NAME STATE ADDRESS PORT NODE AGE simple-game-server-4mp76-fjr6t Allocated ec2-54-250-197-188.ap-northeast-1.compute.amazonaws.com 7369 ip-192-168-8-240.ap-northeast-1.compute.internal 2m29s simple-game-server-4mp76-k75cs Ready ec2-54-250-197-188.ap-northeast-1.compute.amazonaws.com 7474 ip-192-168-8-240.ap-northeast-1.compute.internal 2m29s simple-game-server-4mp76-txwtd Ready ec2-54-250-197-188.ap-northeast-1.compute.amazonaws.com 7094 ip-192-168-8-240.ap-northeast-1.compute.internal 3s
参考
KarpenterとGraviton2を使った大規模ゲーム向けAgones on EKS を立ち上げるサンプル multi-cluster-allocation-demo-for-agones-on-eks の紹介(構成・説明・ソースコード(GitHub))
最後に
今回は、AgonesでEKS上にゲームサーバを構築してみたことを記事にしました。
どなたかの参考になると幸いです。